/**
 * 
 */
package com.nari.heatshare.dao;

import java.util.Date;
import java.util.List;

import com.nari.baseinfo.model.IHeatMeter;
import com.nari.coreframe.dao.hibernate3.IGenericDao;
import com.nari.heatshare.model.IHeatMeterDataGather;
import com.nari.platform.model.PageCond;
import com.nari.platform.model.ResponseMsg;
import com.nari.platform.model.ResultWithPageCond;

/**
 * 
 * @author Xiaopeng
 * @date 2013-8-19
 */
public interface IHeatMeterDataGatherDao extends IGenericDao<IHeatMeterDataGather, String> {

	/**
	 * 分页查询热量表数据列表
	 * @param meterNo
	 * @param recordTime
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-6-23
	 */
	public ResultWithPageCond<IHeatMeterDataGather> queryMeterDataPage(String meterNo, 
			Date recordTime, PageCond pageCond) throws Exception;
	
	/**
	 * 根据定制查询特征信息(所属小区、抄表时间)统计热量表列表数据个数
	 * @param communityUID
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-11
	 */
	public int countCustomizedHmDataList(String communityUID, Date recordTime) throws Exception;
	
	/**
	 * 根据定制查询特征信息(所属小区、抄表时间)查询热量表数据列表
	 * @param communityUID
	 * @param recordTime
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-12-11
	 */
	public List<IHeatMeterDataGather> queryCustomizedHmDataList(String communityUID, 
			Date recordTime) throws Exception;

	/**
	 * 通过所属分摊域ID及抄表日期统计热量表数据的数量
	 * @param shareAreaUID 所属分摊域
	 * @param recordDate 抄表时间
	 * @param calculateType 热表计算关系 
	 * 说明：add:加 subs:减
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-8
	 */
	public int countMeterDatasByAreaUIDAndDate(String shareAreaUID,
			Date recordDate, String calculateType) throws Exception;

	/**
	 * 通过热量表表号及抄表日期统计热量表数据的数量
	 * @param meterNo 热量表表号
	 * @param recordDate 抄表时间
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-8
	 */
	public int countMeterDatasByMeterNoAndDate(String meterNo, Date recordDate) throws Exception;
	
	/**
	 * 根据热量表表号、抄表时间查询最新上传的热量表数据(避免读取重复上传的热量表数据)
	 * @param meterNo 热量表表号(必填)
	 * @param recordDate 抄表日期
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public IHeatMeterDataGather queryLatestMeterData(String meterNo, 
			Date recordDate) throws Exception;
	
	/**
	 * 通过热量表列表及抄表日期统计热量表的累计热量
	 * @param meterList 热量表列表
	 * @param recordDate 抄表日期
	 * 说明：统计抄表日期当天最新的热量表数据,避免读取重复上传的热量表数据
	 * @return 累计热量的热量单位为MWh
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public double calcSumHeatByMeterListAndDate(List<IHeatMeter> meterList, 
			Date recordDate) throws Exception;
	
	/**
	 * 通过热量表列表及抄表日期统计热量表的累计流量
	 * @param meterList 热量表列表
	 * @param recordDate 抄表日期
	 * 说明：统计抄表日期当天最新的热量表数据,避免读取重复上传的热量表数据
	 * @return 
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-4
	 */
	public double calcSumFlowByMeterListAndDate(List<IHeatMeter> meterList, 
			Date recordDate) throws Exception;
	
	/**
	 * 格式化热量表数据的累计热量，并以热量单位MWh返回累计热量
	 * @param meterData 热量表数据
	 * 说明：累计热量单位 1:MWh 2:kWh 3:Gj
	 * @return 
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-9-8
	 */
	public double formatSumHeatToMWh(IHeatMeterDataGather meterData) throws Exception;

	/**
	 * 根据分摊域分页查询所属热量表数据
	 * @param shareAreaUID 分摊域唯一标识(必须)
	 * @param meterNo 热量表表号(可选)
	 * @param pageCond
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-1
	 */
	public ResultWithPageCond<IHeatMeterDataGather> queryMeterDataPageByAreaUID(String shareAreaUID, 
			String meterNo, PageCond pageCond) throws Exception;
	
	/**
	 * 根据热量表ID查询某个时间段内的热消耗量
	 * @param meterUID 热量表ID
	 * @param startDate 起始日期
	 * @param endDate 结束日期
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-9
	 */
	public double queryHeatConsumeByMeterUID(String meterUID, Date startDate, 
			Date endDate) throws Exception;
	
	/**
	 * 根据热量表表号、抄表日期查询历史数据
	 * @param meterNo 热量表表号
	 * @param recordTime 抄表日期
	 * @param dataLimit 取回历史数据的条数，若不限制，则取回所有历史数据
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-14
	 */
	public List<IHeatMeterDataGather> queryHistoryMeterData(String meterNo, 
			Date recordTime, Integer dataLimit) throws Exception;
	
	/**
	 * 新增热量表平滑数据(包括人工干预数据和系统自动平滑数据)
	 * @param meterNo 热量表表号
	 * @param recordTime 抄表时间
	 * @param sumHeat 累计热量
	 * @param sumHeatUnit 累计热量单位 1:MWh 2:kWh 3:Gj
	 * @return 返回平滑数据的ID
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-10-14
	 */
	public String saveTransitionMeterData(String meterNo, Date recordTime, 
			double sumHeat, Integer sumHeatUnit) throws Exception;
	
	/**
	 * 新增或修改热量表数据
	 * 说明：若存在相同表号、相同抄表日期的热量表数据，则无法新增
	 * @param meterData
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-11-13
	 */
	public ResponseMsg saveOrUpdateMeterData(IHeatMeterDataGather meterData) throws Exception;
	
	/**
	 * 批次删除某次任务上传数据（热量表的集中器号无法标识）
	 * @param recordTime 抄表日期(任务批次标识二)
	 * @param dataType 上传的数据类型,若未说明,则删除所有类型的数据
	 * 0:平滑数据	1:txt上传解析数据	2:定点上传数据
	 * 3:掌机上传数据	空或其他:未知来源数据
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2013-12-6
	 */
	public void deleteMeterDataUploadBatch(Date recordTime, Integer dataType) throws Exception;
	
	/**
	 * 统计某一时段内热表数据的记录数
	 * @param meterNo
	 * @param startDate
	 * @param endDate
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-28
	 */
	public int countMeterDataByPeriod(String meterNo, Date startDate, 
			Date endDate) throws Exception;
	
	/**
	 * 查询某一时段内热表的紧前数据
	 * @param meterNo
	 * @param startDate
	 * @param endDate
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-28
	 */
	public IHeatMeterDataGather queryNearlyFrontMeterData(String meterNo, Date startDate, 
			Date endDate) throws Exception;
	
	/**
	 * 查询某一时段内热表的紧后数据
	 * @param meterNo
	 * @param startDate
	 * @param endDate
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-28
	 */
	public IHeatMeterDataGather queryNearlyBackMeterData(String meterNo, Date startDate, 
			Date endDate) throws Exception;
	
	/**
	 * 统计某一时段内热表的计量值
	 * 说明：若此时段内热表数据少于两条记录，则返回0
	 * @param meterNo
	 * @param startDate
	 * @param endDate
	 * @return 返回计量热量的热量单位为MWh
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2014-4-28
	 */
	public double calcMeterMeasureDataMWhByPeriod(String meterNo, Date startDate, 
			Date endDate) throws Exception;
	
	/**
	 * 批量新增热量表数据(数据更新不执行结果统计)
	 * @param meterDataList
	 * @return
	 * @throws Exception
	 * @author Xiaopeng
	 * @date 2015-1-20
	 */
	public int saveMeterDataBatch(List<IHeatMeterDataGather> meterDataList) throws Exception;
	
	/**
	 * 查询某一热表一段时间内的数据
	 * */
	public List<IHeatMeterDataGather> queryMeterData(String meterNo, Date startDate, 
			Date endDate) throws Exception;

	List<IHeatMeterDataGather> queryHeatMeterDataWithLimit(String meterNo,
			Date startDate, Date endDate, int limit) throws Exception;
/**
 * 查询某一个热量表号最后一次上传的日期
 * */
public  Date queryLastUploadDate(String  meterNo) throws Exception;
	
}
